//规则一:100元以下 不加分 rule "order_rule_1" when $order:Order(amount < 100) then $order.setScore(0); System.out.println("成功匹配到规则一:100元以下 不加分"); end
//规则二:100元 - 500元 加100分 rule "order_rule_2" when $order:Order(amount >= 100 && amount < 500) then $order.setScore(100); System.out.println("成功匹配到规则二:100元 - 500元 加100分"); end
//规则三:500元 - 1000元 加500分 rule "order_rule_3" when $order:Order(amount >= 500 && amount < 1000) then $order.setScore(500); System.out.println("成功匹配到规则三:500元 - 1000元 加500分"); end
//规则四:1000元以上 加1000分 rule "order_rule_4" when $order:Order(amount >= 1000) then $order.setScore(1000); System.out.println("成功匹配到规则四:1000元以上 加1000分"); end
Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可,例如上面调用kieSession.insert(order)就是将order对象插入到了工作内存中。
rule "order_rule" when $order:Order(amount < 100) then $order.setAmount(150); update($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end
rule "order_rule2" when $order:Order(amount >= 100 && amount <= 500) then $order.setScore(100); System.out.println("成功匹配到规则二:100元 - 500元 加100分"); end
添加 insert
insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
rule "order_rule" when $order:Order(amount < 100) then Order order = new Order(); order.setAmount(30); insert($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end
rule "order_rule2" when $order:Order(amount >= 100 && amount <= 500) then $order.setScore(100); System.out.println("成功匹配到规则二:100元 - 500元 加100分"); end
删除 retract
retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。
1 2 3 4 5 6 7
rule "order_rule_1" when $order:Order(amout < 100) then retract($order) //retract方法的作用是删除工作内存中的Fact对象,会导致相关规则重新匹配 System.out.println("成功匹配到规则一:100元以下 不加分"); end
rule "rule_1" salience 9 when eval(true) then System.out.println("规则rule_1触发"); end rule "rule_2" salience 10 when eval(true) then System.out.println("规则rule_2触发"); end
rule "rule_3" salience 7 when eval(true) then System.out.println("规则rule_3触发"); end
rule "order_rule_1" when $order:Order(amout < 100) then $order.setScore(0); update($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end
想要实现死循环应该修改与规则有关的值,如下
1 2 3 4 5 6 7 8
rule "order_rule_1" when $order:Order(amount < 100) then $order.setAmount(0); update($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end
避免死循环:
1 2 3 4 5 6 7 8 9
rule "order_rule_1" no-loop true //防止陷入死循环 when $order:Order(amount < 100) then $order.setAmount(0); update($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end